<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        function Person(){

        }
        Person.prototype.name="aaa";
        var p1 = new Person();
        var p2 = new Person();

        p1.name = 'own name'; // 设置实例name属性
        p1.hasOwnProperty('name');  // true
        console.log( p1.hasOwnProperty('name'))
        console.log(p1.name +"<---p1"  )
        console.log(Object.getPrototypeOf(p1).name +"<---p1的原型对象"  )
        console.log(p1.__proto__.name  +"<---p1的__proto__"  )
        console.log(Person.prototype.name +"<---Person.prototype"  )
        // 没有设置实例name属性
        p2.hasOwnProperty('name');  // false
        console.log( p2.hasOwnProperty('name'))

        /*
        in操作符有两种使用方法：一种是在 for-in 代码中使用；一种是单独使用。
        单独使用：
        如果通过对象可以访问某个属性时返回 true，无论该属性是存在于实例中还是存在于原型对象中。例：
        */
        console.log(('name' in p1 ) +"<<==p1可以访问name");  // true，p1中可以访问到name属性
        console.log(('name' in p2 )+"<<==p2可以访问name");  // true，同上。

    </script>
</head>
<body>

</body>
</html>